using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography.X509Certificates;
using UnityEngine;
using System.Linq;
using UnityEngine.UIElements;

[System.Serializable] // 序列化类，使其在Unity编辑器中可见
public class CtrlPointInfo{ // 控制点信息类
    public float DiffH; // 水平偏移量
    public float DiffV; // 垂直偏移量

}
public class FishingRodCtrl : MonoBehaviour
{
    private LineRenderer mLr; // 线渲染器
    private LineRenderer mLr_line;//鱼线的线渲染器

    private Transform mBeginTran; // 钓鱼竿开始的位置
    private Transform mEndTran; // 钓鱼竿结束的位置

    private float mStrength; // 钓鱼竿的受力大小
    private Transform mTarget; // 钓鱼竿的目标位置

    public List<CtrlPointInfo> CtrlPointInfos;//控制点的偏移信息列表

    //控制点信息
    // public List<Transform> CtrlPoints;
    void Start()
    {
        mLr = GetComponent<LineRenderer>();; // 获取线渲染器组件
        mBeginTran = transform.GetChild(0); // 获取第一个子物体的Transform组件，即钓鱼竿开始的位置
        mEndTran = transform.GetChild(1); // 获取第二个子物体的Transform组件，即钓鱼竿结束的位置

        mTarget = GameObject.Find("Target").GetComponent<Transform>(); // 找到名为"Target"的游戏对象，并获取其Transform组件，即钓鱼竿的目标位置
        mLr_line = GameObject.Find("鱼线").GetComponent<LineRenderer>(); // 找到名为"鱼线"的游戏对象，并获取其线渲染器组件
    }

    void Update()
    {
        DrawFishingRod();
        DrawFishingLine();
    }

    //绘制鱼竿
    private void DrawFishingRod(){
        var drawPoints = GetDarwFishingRodPoints(); // 获取绘制钓鱼竿的点
        mLr.positionCount = drawPoints.Count; // 设置线渲染器的顶点数
        mLr.SetPositions(drawPoints.ToArray()); // 设置线渲染器的所有顶点的位置
    }

    //绘制鱼线
    private void DrawFishingLine(){
        Vector3[] points = new Vector3[2]{mEndTran.position, mTarget.position}; // 创建一个包含钓鱼竿结束的位置和目标位置的向量数组
        mLr_line.positionCount = 2; // 设置鱼线的线渲染器的顶点数为2
        mLr_line.SetPositions(points); // 设置鱼线的线渲染器的所有顶点的位置
    }

    //获取绘制鱼竿的点
    private List<Vector3> GetDarwFishingRodPoints(){ // 获取绘制钓鱼竿的点的方法
        //计算力的大小（通过Target和鱼竿竿稍的距离）
        mStrength = Mathf.Clamp(Vector2.Distance(mEndTran.position, mTarget.position) - 5, 0, 100) * 0.2f; // 计算力的大小，通过目标位置和钓鱼竿结束的位置的距离，然后减去5，最后乘以0.2

        List<Vector3> points = new List<Vector3>(); // 创建一个新的向量列表，用于存储点
        //获取控制点
        List<Vector3> mCtrlPoints = new List<Vector3>(); // 创建一个新的向量列表，用于存储控制点
        mCtrlPoints.Add(mBeginTran.position); // 将钓鱼竿开始的位置添加到控制点列表中
        // mCtrlPoints.AddRange(CtrlPoints.Select(x => x.position));
        //循环创建控制点
        for (int i = 0; i < CtrlPointInfos.Count; i++) // 遍历控制点的偏移信息列表
        {
            //水平方向的偏移
            Vector3 ctrlPoint = mBeginTran.position + (mEndTran.position - mBeginTran.position) * CtrlPointInfos[i].DiffH; // 计算控制点的位置，首先进行水平方向的偏移
            //再进行垂直方向的偏移
            ctrlPoint = ctrlPoint + (Vector3)Vector2.Perpendicular(mEndTran.position - mBeginTran.position) * CtrlPointInfos[i].DiffV * -1 * mStrength; // 然后进行垂直方向的偏移
            mCtrlPoints.Add(ctrlPoint); // 将计算出的控制点添加到控制点列表中
        }

        //最好一个控制点单独控制，从鱼竿竿稍 向力的反方向偏移，可以使曲线顺滑
        Vector3 lastCtrlPoint = mEndTran.position + (mEndTran.position - mTarget.position).normalized * CtrlPointInfos.Last().DiffV * mStrength; // 计算最后一个控制点的位置，从钓鱼竿结束的位置向力的反方向偏移

        mCtrlPoints.Add(mEndTran.position); // 将钓鱼竿结束的位置添加到控制点列表中

        for (int i = 0; i < 100; i++){ // 遍历100次
            points.Add(BezierHelper.Bezier(i/100f, mCtrlPoints)); // 使用贝塞尔曲线算法计算点的位置，并添加到点列表中
        }
        return points; // 返回点列表
    }
}
